/* 
 * File:   CFdEventMonitor-Inl.h
 * Copyright (c) 2010. Silviu Caragea <silviu@intelliproject.net>
 * Created on January 30, 2011, 11:31 PM
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions
 * are met:
 *  1.Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  2.Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *  3.All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *       This product includes software developed by the University of
 *       California, Berkeley and its contributors.
 *  4.Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef CFDEVENTMONITOR_INL_H
#define	CFDEVENTMONITOR_INL_H

#include "CFdEventMonitor.h"

namespace litevent
{

template <class K> inline int CFdEventMonitor::SetEventWatcher(int fd, void*context, int events, K *obj,void(K::*method)(int, void*,int))
{
    int returnValue = 0;

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.lock();
#endif

    if(evInterface->fdRegisterEvent(fd,context,obj,method))
    {
        evInterface->fdSetEvent(fd, events);
        returnValue = 1;
    }

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.unlock();
#endif

    return returnValue;
}

inline int CFdEventMonitor::SetEventWatcher(int fd, fd_event_handler handler, void*context, int events)
{
    int returnValue = 0;

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.lock();
#endif

    if(evInterface->fdRegisterEvent(fd, handler, context))
    {
        evInterface->fdSetEvent(fd, events);
        returnValue = 1;
    }

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.unlock();
#endif

    return returnValue;
}

inline bool CFdEventMonitor::isInitialised()
{
    bool isInit;

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.lock();
#endif

    isInit = (evInterface != NULL);

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.unlock();
#endif

    return isInit;

}

inline void CFdEventMonitor::ResetWatcher()
{

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.lock();
#endif

    evInterface->reset();

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.unlock();
#endif

}

inline void CFdEventMonitor::RemoveEventWatcher(int fd)
{

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.lock();
#endif

    evInterface->fdDeleteEvent(fd);
    evInterface->fdUnregisterEvent(fd);

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.unlock();
#endif

}

inline void CFdEventMonitor::ChangeFdEvent(int fd, int events)
{

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.lock();
#endif

    if(evInterface->isfdRegistered(fd))
        evInterface->fdSetEvent(fd, events);

#ifdef HAVE_MULTITHREAD_LITEVENT
    m_lock.unlock();
#endif

}

}
#endif	/* CFDEVENTMONITOR_INL_H */

